#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
昆明地铁数据分析与可视化 - 第二部分
本部分实现昆明地铁运营站点和线路的基本分析功能
仅关注已投入运营的地铁站
"""

import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties
import geopandas as gpd
import warnings
from pathlib import Path
from kunming_metro_analysis_part1 import load_data, extract_city_data

# 忽略警告
warnings.filterwarnings('ignore')

# 设置中文字体
try:
    font = FontProperties(fname=r"C:\Windows\Fonts\SimHei.ttf")
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
except:
    print("无法加载SimHei字体，使用系统默认字体")

# 创建输出目录
output_dir = "analysis_results/kunming_analysis"
os.makedirs(output_dir, exist_ok=True)

def analyze_stations(kunming_stations):
    """分析昆明地铁运营站点数据"""
    print("\n=== 昆明地铁运营站点分析 ===")
    print(f"昆明地铁运营站点总数: {len(kunming_stations)}个")
    
    # 检查数据中是否有线路名列
    if '线路名' not in kunming_stations.columns:
        print("站点数据中缺少'线路名'列，尝试查找替代列名...")
        # 尝试查找可能的替代列名
        potential_columns = [col for col in kunming_stations.columns if '线' in col or 'line' in col.lower()]
        
        if potential_columns:
            line_column = potential_columns[0]
            print(f"使用'{line_column}'列作为线路名")
            
            # 统计各线路的站点数量
            line_station_counts = kunming_stations.groupby(line_column).size().sort_values(ascending=False)
            
            print("\n各线路运营站点数量:")
            for line, count in line_station_counts.items():
                print(f"{line}: {count}个站点")
            
            # 绘制线路站点数量柱状图
            plt.figure(figsize=(10, 6))
            line_station_counts.plot(kind='bar', color='skyblue')
            plt.title('昆明地铁各线路运营站点数量')
            plt.xlabel('线路')
            plt.ylabel('站点数量')
            plt.xticks(rotation=45)
            plt.tight_layout()
            plt.savefig(f"{output_dir}/kunming_line_station_counts.png", dpi=300)
            plt.close()
            print("线路运营站点数量统计图已保存")
        else:
            print("未找到合适的线路名列，无法进行线路分析")
            print("可用的列名有:", kunming_stations.columns.tolist())
    else:
        # 统计各线路的站点数量
        line_station_counts = kunming_stations.groupby('线路名').size().sort_values(ascending=False)
        
        print("\n各线路运营站点数量:")
        for line, count in line_station_counts.items():
            print(f"{line}: {count}个站点")
        
        # 绘制线路站点数量柱状图
        plt.figure(figsize=(10, 6))
        line_station_counts.plot(kind='bar', color='skyblue')
        plt.title('昆明地铁各线路运营站点数量')
        plt.xlabel('线路')
        plt.ylabel('站点数量')
        plt.xticks(rotation=45)
        plt.tight_layout()
        plt.savefig(f"{output_dir}/kunming_line_station_counts.png", dpi=300)
        plt.close()
        print("线路运营站点数量统计图已保存")
    
    # 分析站点地理分布
    try:
        # 检查是否有经纬度数据
        coord_columns = None  # 初始化为None，稍后再赋值
        
        if 'Lng' in kunming_stations.columns and 'Lat' in kunming_stations.columns:
            coord_columns = ['Lng', 'Lat']
            print(f"使用 {coord_columns[0]} 和 {coord_columns[1]} 列作为经纬度坐标")
        elif 'longitude' in kunming_stations.columns and 'latitude' in kunming_stations.columns:
            coord_columns = ['longitude', 'latitude']
            print(f"使用 {coord_columns[0]} 和 {coord_columns[1]} 列作为经纬度坐标")
        elif 'lon' in kunming_stations.columns and 'lat' in kunming_stations.columns:
            coord_columns = ['lon', 'lat']
            print(f"使用 {coord_columns[0]} 和 {coord_columns[1]} 列作为经纬度坐标")
        elif any('x' in col.lower() for col in kunming_stations.columns) and any('y' in col.lower() for col in kunming_stations.columns):
            x_cols = [col for col in kunming_stations.columns if 'x' in col.lower()]
            y_cols = [col for col in kunming_stations.columns if 'y' in col.lower()]
            if x_cols and y_cols:
                coord_columns = [x_cols[0], y_cols[0]]
                print(f"使用 {coord_columns[0]} 和 {coord_columns[1]} 列作为经纬度坐标")
        else:
            # 尝试查找可能的经纬度列名
            potential_columns = [col for col in kunming_stations.columns if '经' in col or '纬' in col or 'lon' in col.lower() or 'lat' in col.lower()]
            if len(potential_columns) >= 2:
                coord_columns = potential_columns[:2]
                print(f"使用 {coord_columns[0]} 和 {coord_columns[1]} 列作为经纬度坐标")
        
        if not coord_columns:
            raise ValueError("未找到经纬度列")
           
        # 绘制站点分布散点图（带连线）
        plt.figure(figsize=(10, 8))
        
        # 找到线路列名
        line_column = None
        if '线路名' in kunming_stations.columns:
            line_column = '线路名'
        elif '线路' in kunming_stations.columns:
            line_column = '线路'
        else:
            # 尝试查找可能的线路列名
            potential_line_columns = [col for col in kunming_stations.columns if '线' in col or 'line' in col.lower()]
            if potential_line_columns:
                line_column = potential_line_columns[0]
                
        if line_column:
            # 按线路绘制带连线的散点图
            lines = kunming_stations[line_column].unique()
            colors = plt.cm.tab10(np.linspace(0, 1, len(lines)))
            
            for i, line in enumerate(lines):
                line_stations = kunming_stations[kunming_stations[line_column] == line].copy()
                
                # 添加站点序号列（如果不存在）
                if '站点序号' not in line_stations.columns and '序号' not in line_stations.columns:
                    try:
                        # 尝试从站点名中提取数字作为序号
                        if '站点名称' in line_stations.columns:
                            name_column = '站点名称'
                        elif '站名' in line_stations.columns:
                            name_column = '站名'
                        else:
                            # 尝试查找可能的站点名列
                            potential_name_columns = [col for col in line_stations.columns if '站' in col or 'station' in col.lower()]
                            if potential_name_columns:
                                name_column = potential_name_columns[0]
                            else:
                                name_column = None
                        
                        if name_column:
                            # 按站点名称排序（假设名称中可能包含顺序信息）
                            line_stations = line_stations.sort_values(by=name_column)
                    except:
                        # 如果无法提取序号，则保持原始顺序
                        pass
                else:
                    # 如果存在序号列，按序号排序
                    seq_column = '站点序号' if '站点序号' in line_stations.columns else '序号'
                    line_stations = line_stations.sort_values(by=seq_column)
                
                # 绘制站点
                plt.scatter(line_stations[coord_columns[0]], line_stations[coord_columns[1]], 
                           label=line, color=colors[i], s=50, alpha=0.8, zorder=3)
                
                # 绘制连接线
                # plt.plot(line_stations[coord_columns[0]], line_stations[coord_columns[1]], 
                #          color=colors[i], alpha=0.6, linewidth=2, zorder=2)
            
            plt.legend(title="地铁线路", loc='best', bbox_to_anchor=(1, 1))
        else:
            # 如果没有线路信息，则简单绘制所有站点
            plt.scatter(kunming_stations[coord_columns[0]], kunming_stations[coord_columns[1]], 
                       alpha=0.7, s=50, c='red', edgecolors='black', zorder=3)
        
        plt.title('昆明地铁运营站点分布图')
        plt.xlabel(coord_columns[0])
        plt.ylabel(coord_columns[1])
        plt.grid(True, linestyle='--', alpha=0.7)
        plt.tight_layout()
        plt.savefig(f"{output_dir}/kunming_stations_distribution.png", dpi=300)
        plt.close()
        print("运营站点分布图已保存")
        
        # 创建昆明地铁网络地图 (如果有合适的地理坐标)
        try:
            print("尝试创建昆明地铁运营网络地图...")
            
            # 准备绘制带有站点名称的地铁网络图
            plt.figure(figsize=(14, 12))
            
            # 找到站点名称列
            name_column = None
            if '站点名称' in kunming_stations.columns:
                name_column = '站点名称'
            elif '站名' in kunming_stations.columns:
                name_column = '站名'
            else:
                # 尝试查找可能的站点名列
                potential_name_columns = [col for col in kunming_stations.columns if '站' in col or 'station' in col.lower()]
                if potential_name_columns:
                    name_column = potential_name_columns[0]
            
            # 如果有线路信息，按线路绘制不同颜色
            if line_column:
                lines = kunming_stations[line_column].unique()
                
                # 颜色循环
                colors = plt.cm.tab10(np.linspace(0, 1, len(lines)))
                
                for i, line in enumerate(lines):
                    line_stations = kunming_stations[kunming_stations[line_column] == line].copy()
                    
                    # 尝试排序站点（如果有序号信息）
                    if '站点序号' in line_stations.columns:
                        line_stations = line_stations.sort_values(by='站点序号')
                    elif '序号' in line_stations.columns:
                        line_stations = line_stations.sort_values(by='序号')
                    elif name_column:
                        # 尝试按站名排序
                        line_stations = line_stations.sort_values(by=name_column)
                    
                    # 绘制站点
                    plt.scatter(line_stations[coord_columns[0]], line_stations[coord_columns[1]], 
                               label=line, color=colors[i], s=80, alpha=0.8, zorder=3)
                    
                    # 绘制连接线
                    # plt.plot(line_stations[coord_columns[0]], line_stations[coord_columns[1]], 
                    #          color=colors[i], alpha=0.7, linewidth=3, zorder=2)
                    
                    # 添加站点名称标签（如果有站点名称列）
                    if name_column:
                        for idx, row in line_stations.iterrows():
                            plt.text(row[coord_columns[0]], row[coord_columns[1]], 
                                    row[name_column], fontsize=8, 
                                    ha='center', va='bottom', 
                                    bbox=dict(facecolor='white', alpha=0.7, edgecolor='none', boxstyle='round,pad=0.2'),
                                    zorder=4)
                
                plt.legend(title="地铁线路", loc='best', bbox_to_anchor=(1, 1))
            else:
                # 如果没有线路信息，绘制所有站点
                plt.scatter(kunming_stations[coord_columns[0]], kunming_stations[coord_columns[1]], 
                           c='red', s=80, alpha=0.8, zorder=3)
                           
                # 添加站点名称（如果有）
                if name_column:
                    for idx, row in kunming_stations.iterrows():
                        plt.text(row[coord_columns[0]], row[coord_columns[1]], 
                                row[name_column], fontsize=8, 
                                ha='center', va='bottom', 
                                bbox=dict(facecolor='white', alpha=0.7, edgecolor='none', boxstyle='round,pad=0.2'),
                                zorder=4)
            
            plt.title('昆明地铁运营站点散点图')
            plt.xlabel(coord_columns[0])
            plt.ylabel(coord_columns[1])
            plt.grid(True, linestyle='--', alpha=0.5)
            plt.tight_layout()
            plt.savefig(f"{output_dir}/kunming_line_network.png", dpi=300)
            plt.close()
            print("地铁运营站点散点图已保存")
        except Exception as e:
            print(f"创建地铁网络图失败: {str(e)}")
    except Exception as e:
        print(f"生成站点分布图失败: {str(e)}")
        print("站点数据列名:", kunming_stations.columns.tolist())
        
    print("运营站点分析完成")
    return


def analyze_lines(kunming_lines):
    """分析昆明地铁运营线路数据"""
    print("\n=== 昆明地铁运营线路分析 ===")
    
    # 统计基本信息
    line_count = len(kunming_lines)
    print(f"昆明地铁运营线路总数: {line_count}条")
    
    if not kunming_lines.empty:
        # 提取线路名称和长度
        if 'Shape_Leng' in kunming_lines.columns:
            column_name = 'Shape_Leng'
        else:
            column_name = kunming_lines.columns[-1]  # 假设最后一列是长度数据
            
        kunming_lines['线路长度(km)'] = pd.to_numeric(kunming_lines[column_name]) * 100  # 假设原单位为百公里
        
        # 显示各线路长度
        line_lengths = kunming_lines.groupby('线路名')['线路长度(km)'].sum().sort_values(ascending=False)
        print("\n各运营线路长度:")
        for line, length in line_lengths.items():
            print(f"  {line}: {length:.2f}公里")
        
        # 计算总长度
        total_length = kunming_lines['线路长度(km)'].sum()
        print(f"昆明地铁运营总长度: {total_length:.2f}公里")
        
        # 绘制线路长度条形图
        plt.figure(figsize=(12, 6))
        ax = sns.barplot(x=line_lengths.index, y=line_lengths.values, palette='viridis')
        plt.title('昆明地铁各运营线路长度对比')
        plt.xlabel('线路名称')
        plt.ylabel('线路长度(km)')
        plt.xticks(rotation=45)
        plt.grid(True, axis='y', linestyle='--', alpha=0.7)
        
        # 在条形图上添加数值标签
        for i, v in enumerate(line_lengths.values):
            ax.text(i, v + 0.5, f'{v:.2f}', ha='center')
            
        plt.tight_layout()
        plt.savefig(f"{output_dir}/kunming_line_lengths.png", dpi=300)
        plt.close()
        print("运营线路长度对比图已保存")
        
        # 与其他城市对比分析
        cities_to_compare = ['北京', '上海', '广州', '深圳', '成都', '重庆', '武汉', '西安', '南京', '杭州', '昆明']
        compare_with_other_cities(kunming_lines, cities_to_compare)
    
    return line_count

def compare_with_other_cities(kunming_lines, cities_to_compare):
    """与其他城市进行运营线路和站点数量对比"""
    # 加载全国数据
    stations_2023_df, lines_2023_df, _, _, _ = load_data()
    
    # 计算各城市的线路数量
    city_line_counts = lines_2023_df['城市'].value_counts()
    city_line_counts = city_line_counts[city_line_counts.index.isin(cities_to_compare)]
    
    # 绘制城市线路数量对比图
    plt.figure(figsize=(12, 6))
    sns.barplot(x=city_line_counts.index, y=city_line_counts.values, palette='Blues_d')
    plt.title('昆明与其他主要城市地铁运营线路数量对比')
    plt.xlabel('城市')
    plt.ylabel('运营线路数量')
    plt.xticks(rotation=45)
    plt.grid(True, axis='y', linestyle='--', alpha=0.7)
    
    # 突出显示昆明的数据
    if '昆明' in city_line_counts.index:
        idx = list(city_line_counts.index).index('昆明')
        plt.gca().patches[idx].set_facecolor('red')
    
    plt.tight_layout()
    plt.savefig(f"{output_dir}/city_line_count_comparison.png", dpi=300)
    plt.close()
    print("城市运营线路数量对比图已保存")
    
    # 计算各城市的站点数量
    city_station_counts = stations_2023_df['城市'].value_counts()
    city_station_counts = city_station_counts[city_station_counts.index.isin(cities_to_compare)]
    
    # 绘制城市站点数量对比图
    plt.figure(figsize=(12, 6))
    ax = sns.barplot(x=city_station_counts.index, y=city_station_counts.values, palette='Blues_d')
    plt.title('昆明与其他主要城市地铁运营站点数量对比')
    plt.xlabel('城市')
    plt.ylabel('运营站点数量')
    plt.xticks(rotation=45)
    plt.grid(True, axis='y', linestyle='--', alpha=0.7)
    
    # 在柱状图上添加数值标签
    for i, v in enumerate(city_station_counts.values):
        ax.text(i, v + 5, f'{v}', ha='center')
    
    # 突出显示昆明的数据
    if '昆明' in city_station_counts.index:
        idx = list(city_station_counts.index).index('昆明')
        plt.gca().patches[idx].set_facecolor('red')
    
    plt.tight_layout()
    plt.savefig(f"{output_dir}/city_station_count_comparison.png", dpi=300)
    plt.close()
    print("城市运营站点数量对比图已保存")

if __name__ == "__main__":
    # 加载数据
    stations_2023_df, lines_2023_df, stations_2024_df, lines_2024_df, flow_df = load_data()
    
    # 提取昆明数据 (优先使用2024年数据，如果没有则使用2023年数据)
    if not stations_2024_df.empty and '昆明' in stations_2024_df['城市'].values:
        kunming_stations, kunming_lines, kunming_flow = extract_city_data(
            stations_2024_df, lines_2024_df, flow_df, "昆明"
        )
    else:
        kunming_stations, kunming_lines, kunming_flow = extract_city_data(
            stations_2023_df, lines_2023_df, flow_df, "昆明"
        )
    
    # 分析站点和线路
    analyze_stations(kunming_stations)
    analyze_lines(kunming_lines) 